package main

import "fmt"

func main() {
	jobs := make(chan int, 5)
	done := make(chan bool)

	//这是相当于在主Goroutine 中另开了一个Goroutine
	go func() {
		//无线循环
		for {
			// j表示 从jobs中取到的数据
			// more bool类型 判断通道中是否还有数据
			j, more := <-jobs
			if more {
				fmt.Println("received job", j)
			} else {
				fmt.Println("received all jobs")
				done <- true
				return
			}
		}
	}()

	/*
		主 Goroutine 使用 for 循环向 jobs 通道发送三个整数，
		然后调用 close(jobs) 关闭 jobs 通道。关闭通道表示不会再向通道发送数据。
		关闭通道后，仍然可以从通道中接收数据
	*/
	for j := 1; j <= 5; j++ {
		jobs <- j
		fmt.Println("sent job", j)
	}
	close(jobs)
	fmt.Println("sent all jobs")

	/*
		主 Goroutine 使用 <-done 语句等待从 done 通道接收数据。
		当匿名 Goroutine 完成工作并发送数据到 done 通道时，主 Goroutine 接收到数据，然后程序结束。
		可以发现	fmt.Println(o)是最后执行的，等所有的
	*/
	var o = <-done
	fmt.Println(o)
}
